//
//  nodetree.h
//  二叉树
//
//  Created by chenyh on 2021/1/20.
//

#ifndef nodetree_h
#define nodetree_h

#include <stdio.h>
/**
 类型名： 二叉查找树
 类型属性： 二叉树要么是空节点的集合（空树），要么是有一个根节点的节点集合
 每个节点都有两个子树，叫做左子树和右子树
 每个子树本身也是一个二叉树，也有可能是空树
 二叉查找树是一个有序的二叉树，每个节点包含一个项，
 左子树的所有项都在根节点项的前面，右子树的所有项都在根节点项的后面。
 类型操作：初始化树为空
 确定树是否为空
 确定树是否已满
 确定树中的项数
 在树中添加一个项
 在树中删除一个项
 在树中查找一个项
 在树中访问一个项
 清空树
 */

#include <stdbool.h>
//根据具体情况重新定义Item
#define SLEN 20
typedef struct item {
    char petname[SLEN];
    char petkind[SLEN];
} Item;

#define MAXITEMS 10
typedef struct trnode {
    Item item;
    struct trnode * left; //指向左分支的指针
    struct trnode * right;
} Trnode;

typedef struct tree {
    Trnode * root;  //指向根节点的指针
    int size;       //树的项数
} Tree;

// 把树初始化为空
void InitializeTree(Tree * ptree);

// 确定树是否为空
bool TreeIsEmpty(const Tree * ptree);

// 确定树是否已满
bool TreeIsFull(const Tree * ptree);

// 确定树的项数
int TreeItemCount(const Tree * ptree);

// 在树中添加一个项
bool AddItem(const Item * pi,Tree * ptree);

// 在树中查找一个项
bool InTree(const Item * pi,const Tree * ptree);

// 从树中删除一个项
bool DeleteItem(const Item * pi,Tree * ptree);

// 把函数应用于树中的每一项
void Traverse(const Tree * ptree,void(*pfun)(Item item));

// 删除树中的所有内容
void DeleteAll(Tree * ptree);

#endif /* nodetree_h */
